# TODO 在Python中，异常处理是通过使用 try-except 语句块来实现的。try 块用于包含可能引发异常的代码，而 except 块用于处理异常。

# Python 使用 try/except 语句来进行异常处理。以下是使用这些语句的一些基本规则和案例：
# 注意事项：
# try 块中的代码可能会引发异常。在这个代码块中，你应该只包含可能会引发异常的代码，而不是那些总是能成功执行的代码。
# except 块是用来处理特定类型的异常。你可以有多个 except 块，用来处理不同类型的异常。
# else 块是在 try 块成功执行而没有引发异常时执行的代码。
# finally 块是无论 try 块是否引发异常都会执行的代码。
# 以下是一些案例：
# 案例1：基本的 try/except 结构
# 这段代码尝试将1除以0，这会引发一个 ZeroDivisionError。当这个异常被引发时，程序会立即跳转到 except 块，打印出 "除数不能为零！"。
try:
    # 这个代码块可能会引发异常
    x = 1 / 0
except ZeroDivisionError:
    # 当引发 ZeroDivisionError 异常时执行
    print("除数不能为零！")
# 除数不能为零！


# 案例2：带有 else 的 try/except 结构
# 这段代码尝试将1除以1，这是合法的，所以不会引发异常。因此，程序会跳过 except 块，然后执行 else 块，打印出 "没有发生异常！"。
try:
    x = 1 / 1
except ZeroDivisionError:
    print("除数不能为零！")
else:
    print("没有发生异常！")
# 没有发生异常！


# 案例3：带有 finally 的 try/except 结构
# 这段代码会引发 ZeroDivisionError，所以程序会跳到 except 块。不管 try 块是否引发了异常，finally 块的代码总是会被执行。因此，最后会打印出 "无论是否发生异常，都会执行这句话！"。
try:
    x = 1 / 0
except ZeroDivisionError:
    print("除数不能为零！")
finally:
    print("无论是否发生异常，都会执行这句话！")

# 案例4：处理多种类型的异常
# 这段代码首先引发了 ZeroDivisionError，所以程序会跳到对应的 except 块。注意如果 try 块中引发了多个异常，只会处理第一个异常，后面的异常会被忽略。
try:
    x = 1 / 0
    y = unknown_variable  # 这里虽然编译不通过,IDEA代码编辑器会爆红,但是代码可以跑通,原因: 第一个异常捕获到了,会跳过这行的执行,代码不执行就不会报错.
except ZeroDivisionError:
    print("除数不能为零！")
except NameError:
    print("变量名未定义！")


# 注意事项:这里是Python这门语言本身特性导致的.
# Python 是一种解释型语言，它在运行时逐行解释并执行代码，而不是像一些编译型语言（如 C 或 Java）那样在程序运行之前就完成编译。因此，Python 可能会在执行到某一行代码时才发现错误，如语法错误或者其他运行时错误。
# 解释型语言有一些优点，比如更好的跨平台兼容性，以及在开发过程中更快的反馈（因为你可以直接运行代码而无需等待编译）。但它也有一些缺点，比如运行速度通常比编译型语言慢，以及错误可能在运行时才被发现。
# 在 Python 中，为了尽可能早地发现错误，有一些工具和实践可以帮助你，例如使用 linting 工具（如 pylint 或 flake8），编写和运行单元测试，以及进行代码审查。

# Python中有许多内置的异常类型。以下是一些常见的异常类型：
#  ZeroDivisionError：除以零错误
#  TypeError：类型错误，例如将不兼容的类型进行操作
#  ValueError：值错误，例如将无效的值传递给函数
#  FileNotFoundError：文件不存在错误，当尝试打开不存在的文件时引发
#  IndexError：索引错误，当访问列表、元组或字符串中不存在的索引时引发
#  KeyError：键错误，当在字典中使用不存在的键时引发
#  NameError：名称错误，当使用未定义的变量或函数名时引发
#  AttributeError：属性错误，当访问不存在的属性或方法时引发
#  ImportError：导入错误，当导入模块失败时引发
#  IOError：输入/输出错误，发生文件操作错误时引发
#  PermissionError：权限错误，当尝试执行没有权限的操作时引发
#  KeyboardInterrupt：键盘中断错误，当用户中断程序执行时引发
# 这只是一些常见的异常类型，实际上Python还提供了更多的异常类型，你可以在Python官方文档中找到完整的异常类型列表。

# 手动抛异常的用法
# 在Python中，你可以使用 raise 语句手动抛出异常。通过手动引发异常，你可以在特定条件下控制程序的流程，并在需要时中断程序的执行。以下是手动引发异常的示例：
def divide_numbers(dividend, divisor):
    if divisor == 0:
        raise ZeroDivisionError("除数不能为零！")
    result = dividend / divisor
    return result


try:
    dividend = int(input("请输入被除数："))
    divisor = int(input("请输入除数："))
    result = divide_numbers(dividend, divisor)
    print("结果为：", result)
except ZeroDivisionError as e:
    print("发生错误：", str(e))
# 在上面的示例中，我们定义了一个名为 divide_numbers 的函数，它接受两个参数：被除数和除数。如果除数为零，我们使用 raise 语句手动引发 ZeroDivisionError 异常，并提供错误消息作为异常的参数。
# 在 try 块中，我们调用 divide_numbers 函数并打印结果。如果发生除以零的情况，将引发异常，并在 except 块中捕获并打印错误消息。
# 通过手动引发异常，你可以在程序中定义自己的异常情况，并根据需要进行处理。这使得你可以更好地控制程序的行为，并提供有用的错误信息。